// 简单的迭代器模式--->参数：1、参数数组  2、每一次迭代都调用的回调函数
function each(params: any[], callback: Function) {
    for (let i = 0; i < params.length; i++) {
        // 将参数数组的下标和当前参数依次传入给回调函数
        callback.call(params[i], i, params[i]);
    }
}
// 测试用例
function log(i: number, value: any) {// 输出函数
    console.log(i, value);
}
each([1, 2, 3, 4, 5], log);// log函数被依次正常的调用

// 简单的外部迭代器模式
function outerIterator(target: any): OuterInterator {
    let current: number = 0;
    return {
        next() {
            current += 1;
        },
        isDone() {
            return current >= target.length;
        },
        getCurrentItem() {
            return target[current];
        },
        len() {
            return target.length;
        }
    };
}
// 测试用例
function compare(iterator1: OuterInterator, iterator2: OuterInterator) {// 迭代器比较函数
    while (!iterator1.isDone() && !iterator2.isDone()) {
        if (iterator1.getCurrentItem() !== iterator2.getCurrentItem() || iterator1.len() !== iterator2.len()) {
            throw new Error('传入的两组数据并不相等!')
        }
        // 两个迭代器都进入下轮迭代
        iterator1.next();
        iterator2.next();
    }
    console.log('两组数据相等。');
}
// 生成迭代器
const iterator1 = outerIterator([1, 2, 3, 4, 5]);
const iterator2 = outerIterator([1, 2, 3, 4, 5]);
const iterator3 = outerIterator([1, 2, 3, 4]);
const iterator4 = outerIterator([1, 2, 3]);

compare(iterator1, iterator2);// 相等！
// compare(iterator3, iterator4);// 不相等！


// 穷举策略的外部迭代器
function enmuOuterIterator(...callbacks: BooleanFunction[]) {
    for (let i = 0; i < callbacks.length; i++) {
        let canUse: boolean = callbacks[i]();
        if (canUse) {
            return callbacks[i];
        }
    }
}

// 测试用例
const firefoxCanUse = function () {// 只有火狐浏览器能用的方法
    if (browser !== 'firefox') {
        return false
    }
    console.log('只有火狐浏览器可以用');
    return true
}
const chromeCanUse = function () {// 只有谷歌浏览器能用的方法
    if (browser !== 'chrome') {
        return false
    }
    console.log('只有chrome浏览器可以用');
    return true
};
const IECanUse = function () {// 只有IE浏览器能用的方法
    if (browser !== 'firefox') {
        return false
    }
    console.log('只有ie浏览器可以用');
    return true
};
let browser = 'chrome';// 假设这是当前的浏览器环境
enmuOuterIterator(firefoxCanUse, chromeCanUse, IECanUse);// 成功的调用了谷歌浏览器方法
